#include "StdAfx.h"
#include "FFEncodeInputPin.h"


CFFEncodeInputPin::CFFEncodeInputPin(CBaseFilter *pFilter,CCritSec *pLock,HRESULT *phr,LPCWSTR pName, int streamType)
:	CBaseInputPin(L"CFFEncodeInputPin", pFilter, pLock, phr, pName)
,	m_eType(streamType)
,	m_validEvent(TRUE)
{


}

CFFEncodeInputPin::~CFFEncodeInputPin()
{
	SetDelegate(NULL);
}

STDMETHODIMP CFFEncodeInputPin::NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
	*ppv = 0;
	return
		QI(IMediaSeeking)
		CBaseInputPin::NonDelegatingQueryInterface(riid, ppv); 
}
//
//HRESULT CFFEncodeInputPin::CheckMediaType(const CMediaType *pmt)
//{
//	if( m_eType == FF_TYPE_AUDIO &&
//		pmt->majortype == MEDIATYPE_Audio && 
//		pmt->subtype == MEDIASUBTYPE_PCM &&
//		pmt->formattype == FORMAT_WaveFormatEx)
//	{		
//		WAVEFORMATEX* wfex = (WAVEFORMATEX*)pmt->pbFormat;
//		if(wfex->wBitsPerSample == 16)
//			return S_OK;
//	}
//
//	if( m_eType == FF_TYPE_VIDEO &&
//		pmt->majortype == MEDIATYPE_Video && 
//		(pmt->subtype == MEDIASUBTYPE_RGB24
//		|| pmt->subtype == MEDIASUBTYPE_YV12) )
//		return S_OK;
//
//	return E_FAIL;	
//}
//
//HRESULT CFFEncodeInputPin::CompleteConnect(IPin *pReceivePin)
//{
//	IMediaSeeking* locSeeker = NULL;
//	pReceivePin->QueryInterface(IID_IMediaSeeking, (void**)&locSeeker);
//	SetDelegate(locSeeker);
//
//
//	m_pTrans = ( (CFFEncodeFilter*)m_pFilter)->GetTransBase(m_eType);
//	m_pTrans->PutInFormat(&m_mt);
//
//	return S_OK;
//}
//
//
//HRESULT CFFEncodeInputPin::BreakConnect()
//{
//	CAutoLock locLock(m_pLock);
//	//Release the seeking delegate
//	ReleaseDelegate();
//	return CBaseInputPin::BreakConnect();
//}
//
//void CFFEncodeInputPin::PushFrame(CAutoPtr<CFrameBase> pFrame)
//{
//	for(int i = 0; m_pFilter->IsActive() && !m_bFlushing
//		&& !m_validEvent.Wait(1) 
//		&& i < 1000; 
//	i++);
//
//	if(!m_pFilter->IsActive() || m_bFlushing)
//		return;
//
//	CAutoLock cAutoLock(&m_csListValid);
//
//	m_lstFrame.AddTail(pFrame);
//
//	if(m_lstFrame.GetCount() >= MAX_FRAME_NUMBER)
//		m_validEvent.Reset();
//
//}
//
//CAutoPtr<CFrameBase> CFFEncodeInputPin::PopFrame()
//{
//	CAutoPtr<CFrameBase> pFrame;
//	CAutoLock cAutoLock(&m_csListValid);
//
//	if(m_lstFrame.GetCount()) 
//		pFrame = m_lstFrame.RemoveHead();
//
//	if(m_lstFrame.GetCount() < MAX_FRAME_NUMBER)
//		m_validEvent.Set();
//	return pFrame;
//}
//
//STDMETHODIMP CFFEncodeInputPin::Receive(IMediaSample *pSample)
//{
//	CAutoLock clock(&m_csReceive);
//	HRESULT hr = CBaseInputPin::Receive(pSample);
//	if(FAILED(hr)) return hr;
//
//	CFrameBase* pFrame = NULL;
//	if(m_eType == FF_TYPE_AUDIO){
//		pFrame = (CFrameBase*) new CAudioFrame;		
//	}else if( m_eType == FF_TYPE_VIDEO ){
//		pFrame = (CFrameBase*) new CVideoFrame;		
//	}
//
//	m_pTrans->Translate(pSample, pFrame);
//	CAutoPtr<CFrameBase> apFrame(pFrame);
//	PushFrame(apFrame);
//	return S_OK;
//
//}
//
//HRESULT CFFEncodeInputPin::Active()
//{
//	m_rtMaxStart = -1;
//	m_bEOS = false;
//	m_validEvent.Set();
//	return __super::Active();
//}
//
//HRESULT CFFEncodeInputPin::Inactive()
//{
//	CAutoLock cLock(&m_csListValid);
//	m_lstFrame.RemoveAll();
//	return __super::Inactive();
//}
//
//STDMETHODIMP CFFEncodeInputPin::EndOfStream()
//{
//	CAutoLock clock(&m_csReceive);
//	HRESULT hr = CBaseInputPin::EndOfStream();
//	if(FAILED(hr)) return hr;	
//
//	CAutoPtr<CFrameBase> pFrame(new CFrameBase);
//	pFrame->SetEOS(true);
//	PushFrame(pFrame);
//	m_bEOS = true;
//	return hr;
//
//}
//
//STDMETHODIMP CFFEncodeInputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
//{
//	CAutoLock clock(&m_csReceive);
//
//	return CBaseInputPin::NewSegment(tStart, tStop, dRate);
//}